Capítulo: 2 Entregable 2
En este momento deberemos retomar la Unidad 1 en la cual se creó un minilibro que contiene el entregable de dicha unidad. Este documento tiene como repositorio GitHub (elaborado desde Markdown). Ahora, en esta Unidad 2, se debe continuar con los datos presentados en dicho entregable y se debe evidenciar, en una de las variables en el tiempo, la aproximación en promedio móvil, en rezagos y en estacionalidad. Todo lo anterior, a través de funciones y gráficas que permitan detectar patrones y ciclos de la variable.
En primer lugar, se identifica la ventana temporal de las temperaturas registradas por este sensor, la cual comprende datos diarios desde el 1 de enero de 1975 hasta el 31 de marzo de 2025. No obstante, es importante señalar que el conjunto de datos incluye observaciones que se remontan hasta el año 1941, lo que proporciona una perspectiva histórica amplia. Sin embargo, diversos análisis indican que la calidad y confiabilidad de los registros mejora significativamente a partir de 1972, debido a que en los periodos anteriores se observa una alta frecuencia de valores atípicos y anomalías que podrían comprometer la precisión de cualquier análisis basado en dichas observaciones. Por esta razón, los datos previos a 1972 suelen utilizarse con precaución o ser excluidos de los estudios que requieren alta fiabilidad en las series temporales [9].
Teniendo en cuenta lo anterior, se realizaran distintos análisis temporales de la temperatura promedio de la ciudad de Bogotá. Para ello, se aplicarán técnicas de suavizamiento mediante el cálculo de promedios móviles, así como análisis de rezagos y de estacionalidad. Estas aproximaciones permitirán identificar y representar patrones, tendencias y ciclos a lo largo del tiempo, utilizando funciones estadísticas y gráficas que faciliten la interpretación visual y analítica del comportamiento de la variable.
En primer lugar se carga y verifica el tipo de datos del conjunto de datos seleccionado, garantizando que la fecha esté en formato correcto.
En el siguiente enlace se puede apreciar el proceso de extracción mediante las API de meteostat y Openmeteo en Python.
Notebook de descarga de datos en GitHub
2.1 Promedios móviles (SMA de 7 y 30 días)
El promedio móvil simple (SMA) es una técnica de suavizamiento que consiste en calcular el promedio de un número fijo de observaciones consecutivas. Sirve para reducir el “ruido” en los datos y destacar patrones como tendencias o ciclos, ayudando en el análisis visual de series de tiempo antes de aplicar modelos más complejos.
Se calcularon dos promedios móviles simples (SMA) sobre la variable de temperatura promedio diaria (tavg), utilizando ventanas de 7 y 30 días respectivamente. Para ello, se aplicó la función rollmean, permitiendo un relleno de valores faltantes con NA y alineando las medias móviles hacia la derecha. Luego, se construyó un gráfico de líneas que incluye la serie original de temperatura (en gris claro) y las dos curvas suavizadas correspondientes a los promedios móviles (en azul acero para 7 días y rojo oscuro para 30 días).
Esta gráfica permite observar la evolución suavizada de la temperatura a lo largo del tiempo, eliminando la variabilidad diaria que puede ocultar patrones generales. El promedio móvil de 7 días capta fluctuaciones semanales, mientras que el de 30 días refleja tendencias de más largo plazo. Así, se facilita la identificación de cambios de tendencia y ciclos más amplios en la serie de temperaturas.
Code
library(plotly)
library(tidyr)
library(dplyr)
library(ggplot2)
# Cálculo de medias móviles
datos_filtrados <- datos_filtrados %>%
mutate(
sma_7 = rollmean(tavg, k = 7, fill = NA, align = "right"),
sma_30 = rollmean(tavg, k = 30, fill = NA, align = "right")
)
# Crear la gráfica con ggplot
grafica_interactiva <- ggplot(datos_filtrados, aes(x = fecha)) +
geom_line(aes(y = tavg), color = "gray70", size = 0.5) +
geom_line(aes(y = sma_7), color = "steelblue", size = 0.5) +
geom_line(aes(y = sma_30), color = "darkred", size = 0.5) +
labs(title = "Temperatura promedio con medias móviles",
x = "Fecha", y = "Temperatura promedio (°C)") +
theme_minimal()
# Convertir la gráfica ggplot a plotly para hacerla interactiva
grafica_interactiva <- ggplotly(grafica_interactiva)
# Mostrar la gráfica
grafica_interactiva2.2 Rezagos (lags de 1 y 7 días)
Un rezago (lag) en series de tiempo consiste en desplazar la serie hacia atrás en el tiempo para observar cómo los valores pasados afectan a los valores presentes o futuros. Analizar los rezagos permite identificar autocorrelaciones, que son relaciones importantes para modelar y predecir series temporales.
Se generaron dos nuevas variables de rezago (lag_1 y lag_7), que corresponden a la temperatura promedio registrada uno y siete días antes, respectivamente. Posteriormente, se construyó un diagrama de dispersión donde se graficó la temperatura actual (tavg) contra su valor rezagado de 1 día (lag_1). Para resaltar la relación entre ambas variables, se añadió una línea de regresión lineal sin intervalo de confianza, usando la función geom_smooth con método lm.
La gráfica ilustra la relación entre la temperatura de un día y la del día anterior. Una correlación positiva sugiere que existe dependencia temporal en la serie, es decir, que los valores actuales están influenciados por los valores pasados.
Code
datos_filtrados <- datos_filtrados %>%
mutate(
lag_1 = lag(tavg, 1),
lag_7 = lag(tavg, 7),
lag_30 = lag(tavg, 30)
)
ggplot(datos_filtrados, aes(x = lag_30, y = tavg)) +
geom_point(alpha = 0.3, color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "black") +
labs(title = "Relación entre temperatura actual y rezago de 30 días",
x = "Temperatura rezagada (30 días)", y = "Temperatura actual") +
theme_minimal()
Code
library(plotly)
# Crear la gráfica con plotly
grafica_interactiva <- ggplot(datos_filtrados, aes(x = lag_1, y = tavg)) +
geom_point(alpha = 0.3, color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "black", size = 0.5) + # Línea más fina
labs(title = "Relación entre temperatura actual y rezago de 1 día",
x = "Temperatura rezagada (1 día)", y = "Temperatura actual") +
theme_minimal()
# Convertir la gráfica ggplot a plotly para hacerla interactiva
grafica_interactiva <- ggplotly(grafica_interactiva)## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 1 row containing non-finite outside the scale range
## (`stat_smooth()`).
2.3 Descomposición STL.
La descomposición STL (Seasonal and Trend decomposition using Loess) es un método que separa una serie de tiempo en componentes de tendencia, estacionalidad y ruido. Utiliza un enfoque flexible basado en suavizamiento local, lo que permite capturar patrones no lineales y estacionalidades que pueden cambiar con el tiempo, ofreciendo una interpretación más detallada de la serie.
Para analizar la estacionalidad y la tendencia de la serie, se imputaron valores faltantes de la variable tavg mediante interpolación lineal (na.approx). Luego, se transformó la serie en un objeto de tipo ts con frecuencia anual (365 observaciones por año). Se aplicó una descomposición STL (stl) que separa la serie en tres componentes: tendencia, estacionalidad y residuo, y se presentó el resultado mediante la función autoplot.
La descomposición STL permite visualizar cómo se estructura la variabilidad de la temperatura promedio en sus componentes principales. La tendencia muestra los cambios a largo plazo en la serie, la estacionalidad revela los patrones cíclicos asociados a las estaciones del año, y el residuo indica las fluctuaciones irregulares no explicadas. Este análisis es crucial para entender los comportamientos recurrentes y para preparar adecuadamente los datos para modelos de pronóstico.
Code
# Instala plotly si no lo tienes
# install.packages("plotly")
# Cargar librerías necesarias
library(plotly)
library(zoo)
library(ggplot2)
library(lubridate)
library(forecast)
# Imputamos NA para asegurar continuidad
datos_ts <- ts(na.approx(datos_filtrados$tavg, na.rm = FALSE),
frequency = 365,
start = c(year(min(datos_filtrados$fecha)), yday(min(datos_filtrados$fecha))))
# Descomposición STL
descomposicion <- stl(datos_ts, s.window = "periodic")
# Convertir el gráfico ggplot a interactivo con plotly
grafico_interactivo <- autoplot(descomposicion) +
labs(
title = "Descomposición de la serie de temperatura promedio",
x = "Fecha",
y = "Valor"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 18, color = "#2C3E50"), # Título centrado
axis.title = element_text(size = 12),
strip.text = element_text(face = "bold", size = 13, color = "#2C3E50"),
panel.grid.minor = element_blank()
) +
# Ajustar el grosor de las líneas
geom_line(size = 0.4) # Aquí ajustas el grosor de las líneas
# Convertir el gráfico ggplot a un gráfico interactivo
ggplotly(grafico_interactivo)